feat: implement EPP plugin stability lifecycle and experimentalPlugins feature gate (#1912)#2073
feat: implement EPP plugin stability lifecycle and experimentalPlugins feature gate (#1912)#2073liu-cong wants to merge 2 commits into
Conversation
There was a problem hiding this comment.
Pull request overview
This PR introduces plugin stability levels (Alpha/Beta/Stable) into the EPP plugin registry, adds an experimentalPlugins feature gate to block Alpha plugin initialization by default, and adds stability dependency validation between Consumer/Producer plugins in the data layer.
Changes:
- Extend plugin registration to include stability metadata and expose stability lookup via
GetPluginStability. - Add
experimentalPluginsfeature-gate enforcement during plugin instantiation (Alpha blocked unless explicitly enabled). - Add data-layer validation to prevent higher-stability consumers from depending on lower-stability producers.
Reviewed changes
Copilot reviewed 13 out of 13 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| pkg/epp/framework/plugins/scheduling/profilehandler/disagg/disagg_headers_handler_test.go | Updates test-time plugin registration to pass stability level. |
| pkg/epp/framework/plugins/README.md | Documents stability levels and the experimentalPlugins feature gate. |
| pkg/epp/framework/plugins/flowcontrol/eviction/ordering/priority_time.go | Updates plugin self-registration to include stability. |
| pkg/epp/framework/plugins/flowcontrol/eviction/filtering/sheddable.go | Updates plugin self-registration to include stability. |
| pkg/epp/framework/interface/plugin/stability.go | Adds StabilityLevel constants, feature gate name, and plugin metadata struct. |
| pkg/epp/framework/interface/plugin/registry.go | Extends registration APIs to accept stability and records metadata per plugin type. |
| pkg/epp/framework/interface/plugin/registry_test.go | Updates registry tests for new stability-aware registration and metadata snapshotting. |
| pkg/epp/datalayer/data_graph.go | Adds stability dependency validation after auto-creating missing data producers. |
| pkg/epp/datalayer/data_graph_test.go | Adds unit test coverage for stability dependency validation. |
| pkg/epp/config/loader/configloader.go | Enforces Alpha gating during instantiation and emits deprecation warnings via metadata. |
| pkg/epp/config/loader/configloader_test.go | Updates feature-gate defaults and adds coverage for Alpha gating behavior. |
| cmd/epp/runner/test_runner.go | Updates integration-test runner helper registration to include stability. |
| cmd/epp/runner/runner.go | Centralizes in-tree plugin stability assignments during registration and registers the new feature gate. |
Comments suppressed due to low confidence (1)
cmd/epp/runner/test_runner.go:46
fwkplugin.Registernow also populatesfwkplugin.RegistryMetadata, but the integration-test helper only deletes fromfwkplugin.Registry. This leaves stale metadata in-process and can affect later tests that inspect plugin metadata.
fwkplugin.Register(mockType, fwkplugin.StabilityStable, func(name string, _ *json.Decoder, _ fwkplugin.Handle) (fwkplugin.Plugin, error) {
return mockDataSource, nil
})
defer delete(fwkplugin.Registry, mockType)
}
|
@liu-cong Overall the PR seems quite good. One question. You dealt with Consumers depending on Producers of a lower level of stability. This is good. You didn't deal with other cases of dependencies betwen plugins. Such as the latest Disaggregated plugin which is dependent on decider plugins. Shouldn't this PR deal with that as well? |
LukeAVanDrie
left a comment
There was a problem hiding this comment.
One follow-up... the Alpha gate is only enforced in instantiatePlugins, so plugins auto-created via registerDefaultPlugin or CreateMissingDataProducers bypass it. No Alpha default producers exist today, so probably just a TODO.
…s feature gate (llm-d#1912) Signed-off-by: Cong Liu <conliu@google.com>
3677a53 to
5fe4fad
Compare
|
@LukeAVanDrie @shmuelk I removed the dependency validation on lower stability plugins, and use the feature gate as the single gating mechanism. Let me know what you think. |
| const SheddableFilterType = "sheddable-eviction-filter" | ||
|
|
||
| func init() { | ||
| plugin.Register(SheddableFilterType, SheddableFilterFactory) |
| // breaking ties by newest dispatch time (least KV-cache investment). | ||
| const PriorityThenTimeOrderingType = "priority-then-time-eviction-order-policy" | ||
|
|
||
| func init() { |
… under major refactoring Signed-off-by: Cong Liu <conliu@google.com>
|
@liu-cong The hermetic integration tests are failing. Partly to the use of an Alpha level plugin without your new feature gate. |
Summary
This PR implements the proposal for EPP plugin stability lifecycle and feature gating discussed in #1912.
FIXES #1912
Release note (write
NONEif no user-facing change):